# coding=utf-8

##############################################################################
#
# pluginbase.py
# A base classes for Feeder, Processor, Puglisher
#
# Copyright (c) 2007 Webcore Corp. All Rights Reserved.
#
##############################################################################
""" pluginbase.py - A base classes for Feeder, Processor, Puglisher

$Id: pluginbase.py 14 2011-09-27 07:19:53Z shib.ats $
"""

__author__  = 'Atsushi Shibata <shibata@webcore.co.jp>'
__docformat__ = 'plaintext'
__licence__ = 'MIT'

import logging
from utilities import print_exc

class BasePlugin(object):
    """
    Pluginのbase class
    """

    def set_id(self, the_id):
        """
        A method to set the id of the plugin.
        """
        self.id = the_id


class BaseFeeder(BasePlugin):
    """
    FeederのBase class
    """
    def can_feed(self, d):
        """
        Feederがfeedを行えるかどうかをboolで返す
        dはFeederがデータの永続化に利用するshelveオブジェクト
        """
        return True

    def before_feed(self, d):
        """
        Feederがfeedを行う前に呼び出すmethod
        dはFeederがデータの永続化に利用するshelveオブジェクト
        """
        pass

    def after_feed(self, d):
        """
        Feederがfeedを行った後に呼び出すmethod
        dはFeederがデータの永続化に利用するshelveオブジェクト
        """
        pass

    def feed(self, d):
        """
        feedを行うmethod
        サブクラスは必ずこのmethodを定義する
        dはFeederがデータの永続化に利用するshelveオブジェクト
        atom/rssの1エントリを辞書にし，辞書のリストを返す

        エントリの辞書は以下のキーを持つ
        
        id       : エントリを一意に特定するためのID，文字列(必須)
        link     : エントリのURLなど，文字列(オプション)
        title    : エントリのタイトル，ユニコード文字列(必須)
        summary  : エントリのサマリ，ユニコード文字列(オプション)
        content  : エントリの本文，ユニコード文字列(オプション)
        author   : エントリの作成者，ユニコード文字列(オプション)
        updated  : エントリの作成日，datetime.datetimeインスタンス(オプション)
        channel  : チャンネルの情報，辞書(オプション)

        チャンネルの辞書は以下のキーを持つ
        
        link     : チャンネルのURLなど(オプション)
        title    : チャンネルのタイトル(必須)
        subtitle : チャンネルのサブタイトル(オプション)
        author   : チャンネルの作成者(オプション)
        """
        raise AttributeError("""Subclasses must override feed() method""")


class BaseProcessor(BasePlugin):
    """
    ProcessorのBase class
    """

    def process(self, settings, feeders, publishers):
        """
        設定にしたがってfeederの情報をpublisherに渡す
        """
        raise AttributeError("""Subclasses must override process() method""")


class BasePublisher(BasePlugin):
    """
    PublisherのBase class
    """
    
    def before_publish(self, d):
        """
        Publishする前に呼ばれるfook method
        """
        pass

    def publish(self, d, item):
        """
        Feederが返すitemをpublishする
        """
        raise AttributeError("""Subclasses must override publish() method""")

    def test_publish(self, d, item):
        """
        オプションで定義するpublishのテストを行うメソッド
        テンプレートの適用結果を表示したい場合などに利用する
        """
        pass

    def after_publish(self, d):
        """
        Publishした後に呼ばれるhook method
        """
        pass

    def finish_publish(self):
        """
        A hook method to finalize publish procedire
        """
        pass


